package com.jdkj.tools.util;


import com.fasterxml.jackson.annotation.JsonInclude;

import java.util.HashMap;
import java.util.Map;

/**
 * AjaxResult 是后端给前端返回的标准 JSON 结构：
 * {
 *   "code": 200,
 *   "msg": "操作成功",
 *   "data": {...}
 * }
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AjaxResult extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;

    /** 响应状态码 */
    public static final String CODE_TAG = "code";
    /** 响应消息 */
    public static final String MSG_TAG  = "msg";
    /** 响应数据 */
    public static final String DATA_TAG = "data";

    public AjaxResult() {
    }

    public AjaxResult(int code, String msg) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }

    public AjaxResult(int code, String msg, Object data) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (data != null) {
            super.put(DATA_TAG, data);
        }
    }

    // ========== 以下是常用的静态构造方法 ==========

    /** 操作成功，返回默认消息和无数据 */
    public static AjaxResult success() {
        return AjaxResult.success("操作成功");
    }

    /** 操作成功，返回默认消息和数据 */
    public static AjaxResult success(Object data) {
        return AjaxResult.success("操作成功", data);
    }

    /** 操作成功，自定义消息，无数据 */
    public static AjaxResult success(String msg) {
        return AjaxResult.success(msg, null);
    }

    /** 操作成功，自定义消息和数据 */
    public static AjaxResult success(String msg, Object data) {
        return new AjaxResult(200, msg, data);
    }

    /** 操作失败，返回默认错误消息 */
    public static AjaxResult error() {
        return AjaxResult.error("操作失败");
    }

    /** 操作失败，返回自定义错误消息 */
    public static AjaxResult error(String msg) {
        return AjaxResult.error(500, msg);
    }

    /** 操作失败，返回自定义错误码和消息 */
    public static AjaxResult error(int code, String msg) {
        return new AjaxResult(code, msg, null);
    }

    // ========== 链式 put 方法 ==========

    @Override
    public AjaxResult put(String key, Object value) {
        super.put(key, value);
        return this;
    }

}
